<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<!--[if lt IE 9]>
  <script src="https://oss.maxcdn.com/libs/html5shiv/3.7.0/html5shiv.js"></script>
<![endif]-->
<title>VIM 中文用户手册: 快速键入命令行</title>
<link rel="stylesheet" href="vim-stylesheet.css" type="text/css" />
<link rel="canonical" href="https://yianwillis.github.io/vimcdoc/doc/usr_20.html" />
<script type="text/javascript" src="vimcdoc.js"></script>
<meta name="viewport" content="width=device-width, initial-scale=1" />
</head>
<body>
<nav id=banner>
<form action=tags.html target="tag_iframe">
  <input type="text" name="tag" id="tag" placeholder="标签搜索">
</form>
<iframe name="tag_iframe" src=""></iframe>
<a href="help.html">帮助总览</a> &middot;
<hr/>
<a href="quickref.html">快速参考</a> &middot;
<a href="index.html">命令索引</a> &middot;
<a href="eval.html#functions">函数列表</a> &middot;
<a href="quickref.html#option-list">选项列表</a> &middot;
<hr/>
<a href="usr_toc.html">用户手册</a> &middot;
<a href="help.html#reference_toc">参考手册</a> &middot;
</nav>

<header>
<h2>usr_20</h2>
</header>
<article id=outer>
<section class=inner>
<b class="vimtag"> <a name="usr_20.txt">usr_20.txt</a> </b>    适用于 Vim 9.0 版本。   最近更新: 2022年8月

                     <code class="vim">VIM 用户手册 - by Bram Moolenaar</code>
                                <code class="vim">译者</code>: Chimin Yen

                             快速键入命令行命令

Vim 具备若干基本功能，以简化键入命令的工作。你可以缩写，编辑和重复冒号命令，而
补全功能几乎可以用于所有的场合。

 <a href="usr_20.html#20.1">20.1</a>   命令行编辑
 <a href="usr_20.html#20.2">20.2</a>   命令行缩写
 <a href="usr_20.html#20.3">20.3</a>   命令行补全
 <a href="usr_20.html#20.4">20.4</a>   命令行历史
 <a href="usr_20.html#20.5">20.5</a>   命令行窗口

        下一章:  <a href="usr_21.html#usr_21.txt">usr_21.txt</a>   离开和回来
        前一章:  <a href="usr_12.html#usr_12.txt">usr_12.txt</a>   小窍门
          目录:  <a href="usr_toc.html#usr_toc.txt">usr_toc.txt</a> 

</section><hr class="doubleline" /><section class=inner>
<h4><b class="vimtag"> <a name="20.1">20.1</a> </b>  命令行编辑</h4>
当你用冒号 (:) 命令或用 / 或 ? 搜索一个字符串时，Vim 就会把光标置于屏幕下方。
你在那儿键入命令或者搜索模式。此处即称为命令行，也是用来输入搜索命令的地方。

最为显而易见的编辑命令的方法是按 <code class="special">&lt;BS&gt;</code> 退格键。按下此键即删去光标前面的字符。如
果要删去另一个更早键入的字符，得先用光标方向键把光标移到那儿。

   例如，你键入了: 
<code class="example"></code>
<code class="example">        :s/col/pig/</code>
<code class="example"></code>
在你按下回车键之前，你<code class="note">注意</code>到 "col" 应为 "cow"。为了纠正这个错误，你按五次
<code class="special">&lt;Left&gt;</code> 键。现在，光标正好在 "col" 后面。按 <code class="special">&lt;BS&gt;</code> 键，然后键入正确的字符 "w": 
<code class="example"></code>
<code class="example">        :s/cow/pig/</code>
<code class="example"></code>
现在你可以立刻按 <code class="special">&lt;Enter&gt;</code> 键了。在执行这个命令之前，你无须先把光标移到命令行的
末尾。

命令行上移动光标时最常用的键:

        <code class="special">&lt;Left&gt;</code>                  左移一个字符
        <code class="special">&lt;Right&gt;</code>                 右移一个字符
        <code class="special">&lt;S-Left&gt;</code> 或 <code class="special">&lt;C-Left&gt;</code>    左移一个单词
        <code class="special">&lt;S-Right&gt;</code> 或 <code class="special">&lt;C-Right&gt;</code>  右移一个单词
        <code class="keystroke">CTRL-B</code> 或 <code class="special">&lt;Home&gt;</code>        命令行行首
        <code class="keystroke">CTRL-E</code> 或 <code class="special">&lt;End&gt;</code>         命令行行尾

        <code class="note">备注</code>:
        <code class="special">&lt;S-Left&gt;</code> (光标左移键和 Shift 键同时按下) 和 <code class="special">&lt;C-Left&gt;</code> (光标左移键和
        Control 键同时按下) 并非在所有键盘上都有效。其它 Shift 和 Control 组合
        键也是这种情况。

你也可以用鼠标来移动光标。


删 除

如前所述，<code class="special">&lt;BS&gt;</code> 键删除光标前一个字符。删除光标前整个单词，则用 <code class="keystroke">CTRL-W</code>。

<code class="section">        /the fine pig </code>

                     <code class="keystroke">CTRL-W</code>

<code class="section">        /the fine </code>

<code class="keystroke">CTRL-U</code> 删除命令行上全部文字，从而让你从头开始。


替 换

插入键 <code class="special">&lt;Insert&gt;</code> 让你在插入字符和替换字符两种方式之间切换。先键入如下文字:

<code class="section">        /the fine pig </code>

再按两次 <code class="special">&lt;S-Left&gt;</code> (或 <code class="special">&lt;S-Left&gt;</code> 无效时按八次 <code class="special">&lt;Left&gt;</code>)，把光标移到 "fine" 起始
处。现在，按插入键 <code class="special">&lt;Insert&gt;</code>，切换到替换方式，并键入 "great":

<code class="section">        /the greatpig </code>

哟，空格没了。现在，别用 <code class="special">&lt;BS&gt;</code> 键，因为那会删除 "t" (这跟插入方式不同)。此时应
该按插入键 <code class="special">&lt;Insert&gt;</code>，从替换方式切换到插入方式，并键入空格:

<code class="section">        /the great pig </code>


取 消

你本想执行一个 : 或 / 命令，但却改变了主意。要清除命令行上你已经键入的文字却不
执行该命令，按 <code class="keystroke">CTRL-C</code> 或 <code class="special">&lt;Esc&gt;</code>。

        <code class="note">备注</code>:
        <code class="special">&lt;Esc&gt;</code> 是普遍采用的 "退出" 键。不幸的是，在过去美好的 Vi 版本里，在命令
        行上按 <code class="special">&lt;Esc&gt;</code> 却是执行命令！由于那会被认为是程序 bug，Vim 采用 <code class="special">&lt;Esc&gt;</code> 来
        取消命令。但其 <a href="options.html#'cpoptions'">'cpoptions'</a> 选项可以使 Vim 跟 Vi 兼容。而且，使用映射时
        (那可能是为 Vi 而写的)，<code class="special">&lt;Esc&gt;</code> 键也总和 Vi 兼容。由此看来，采用 <code class="keystroke">CTRL-C</code>
        倒不失为一种永远奏效的方法。

如果你在命令行开始处，那么按 <code class="special">&lt;BS&gt;</code> 将取消整个命令。这就像删除命令行赖以开始的
":" 或 "/"。

</section><hr class="doubleline" /><section class=inner>
<h4><b class="vimtag"> <a name="20.2">20.2</a> </b>  命令行缩写</h4>
有些 ":" 命令确实很长。我们已经提及替代命令 ":substitute" 可以被缩写成 ":s"。
这是一个基本机理，即所有 ":" 冒号命令都可以被缩写。

一个命令可以被缩写成多短呢？英文有 26 个字母，而 Vim 却有多得多的命令。例如，
":set" 也以 ":s" 开头，但 ":s" 不是启动 ":set" 命令的。":set" 可以被缩写成
":se"。
   把一个命令缩写得更短即可能适用于两个命令，此时，该缩写仍然只能代表其中的一
个。而选择哪个却没有任何逻辑，你不得不一个一个地记。最短的有效缩写形式可以在帮
助文件里找到。例如:

<code class="example">        :s[ubstitute]</code>
<code class="example"></code>
它的意思是替代命令 ":substitute" 的最短缩写形式是 ":s"。随后的字符可以任选。因
此 ":su" 和 ":sub" 都有效。

在用户手册里我们有时用命令的全称，有时简称意义明白就用简称。例如，":function"
可以缩写成 ":fu"。但既然大多数读者不明其所指，所以我们采用简称 ":fun"。(Vim 没
有命令 ":funny"，否则简称 ":fun" 也会令人迷惑。)

在 Vim 脚本里你最好用命令全称。当你日后改编脚本时，全称读起来比较容易。除非那
是一些常用命令如 ":w" (":write") 和 ":r" (":read")。
   一个特别令人迷惑的缩写是 ":end"，它可以指 ":endif"，":endwhile" 或
":endfunction"。所以，遇到这类命令时，最好永远采用全称。


选 项 简 称

在用户手册里，我们采用选项的全称。许多选项还有简称。跟 ":" 冒号命令不一样，有
效的选项简称只有一个。例如，<a href="options.html#'autoindent'">'autoindent'</a> 的简称是 <a href="options.html#'ai'">'ai'</a>。因而下面两个命令完成同
样的动作: 
<code class="example"></code>
<code class="example">        :set autoindent</code>
<code class="example">        :set ai</code>
<code class="example"></code>
你可以从这儿找到完整的选项全称和简称的列表:  <a href="quickref.html#option-list">option-list</a> 。

</section><hr class="doubleline" /><section class=inner>
<h4><b class="vimtag"> <a name="20.3">20.3</a> </b>  命令行补全</h4>
命令行补全是那些仅仅因为它就值得从 Vi 转到 Vim 的功能之一。一旦你用上了这个功
能，你就离不开它了。

假定你有个文件目录，其中存放了这些文件:

        info.txt
        intro.txt
        bodyofthepaper.txt

你用这个命令来编辑最后那个文件: 
<code class="example"></code>
<code class="example">        :edit bodyofthepaper.txt</code>
<code class="example"></code>
这很容易打错。一个快得多的方法是: 
<code class="example"></code>
<code class="example">        :edit b&lt;Tab&gt;</code>
<code class="example"></code>
其结果是同样的命令。这是怎么回事？制表键 <code class="special">&lt;Tab&gt;</code> 会补全光标前的词。在本例中就是
"b"。Vim 在目录中寻找并找到了唯一的一个以 "b" 开头的文件。那个文件想必是你寻找
的，因此 Vim 为你补全了文件名。

现在键入: 
<code class="example"></code>
<code class="example">        :edit i&lt;Tab&gt;</code>
<code class="example"></code>
Vim 会鸣起响铃，并给你这个结果: 
<code class="example"></code>
<code class="example">        :edit info.txt</code>
<code class="example"></code>
响铃的意思是 Vim 找到了不止一个匹配。然后它使用了找到的第一个匹配 (按字母顺
序)。如果你再按一次 <code class="special">&lt;Tab&gt;</code>，你得到: 
<code class="example"></code>
<code class="example">        :edit intro.txt</code>
<code class="example"></code>
这样，如果第一次 <code class="special">&lt;Tab&gt;</code> 没给你你要找的文件，你就再按一次。如果还有匹配的文件，
你将会看到它们每一个，每按一次，就看到一个。
   如果你在最后一个匹配文件名上按 <code class="special">&lt;Tab&gt;</code>，你将会再次看到你起初键入的那个命令: 
<code class="example"></code>
<code class="example">        :edit i</code>
<code class="example"></code>
然后一切再从头开始。这样，Vim 就在匹配列表内周而复始地循环。使用 <code class="keystroke">CTRL-P</code> 依相反
方向循环匹配列表:

              &lt;------------------- <code class="special">&lt;Tab&gt;</code> -------------------------+
                                                                  |
                  <code class="special">&lt;Tab&gt;</code> --&gt;                    <code class="special">&lt;Tab&gt;</code> --&gt;
        :edit i               :edit info.txt               :edit intro.txt
                  &lt;-- <code class="keystroke">CTRL-P</code>                   &lt;-- <code class="keystroke">CTRL-P</code>
           |
           +---------------------- <code class="keystroke">CTRL-P</code> ------------------------&gt;


上 下 文

当你键入 ":set i" 而不是 ":edit i"，并按 <code class="special">&lt;Tab&gt;</code>，你得到的是: 
<code class="example"></code>
<code class="example">        :set icon</code>
<code class="example"></code>
嗨，为什么你没得到 ":set info.txt"？这是由于 Vim 的补全功能是上下文相关的。
Vim 寻找的那类词取决于关键词前面的命令。Vim 知道你不可能在命令 ":set" 后面用一
个文件名，但却可以用一个选项名。
   同样，如果你重复键入 <code class="special">&lt;Tab&gt;</code>，Vim 就会在所有匹配间周而复始地循环。你最好开始
时多键入几个字符，否则匹配的选项会很多: 
<code class="example"></code>
<code class="example">        :set isk&lt;Tab&gt;</code>
<code class="example"></code>
结果是: 
<code class="example"></code>
<code class="example">        :set iskeyword</code>
<code class="example"></code>
现在键入 "=" 并按 <code class="special">&lt;Tab&gt;</code>: 
<code class="example"></code>
<code class="example">        :set iskeyword=@,48-57,_,192-255</code>
<code class="example"></code>
在此，Vim 插入的是该选项原来的设定值。现在你可以编辑它了。
   按 <code class="special">&lt;Tab&gt;</code> 键补全的乃是 Vim 在命令行那个位置上所期待的。你不妨试试，看它究竟
是如何补全的。在某些情形下你会得不到你想要的结果。那或者因为 Vim 不知道你要什
么，或者因为 Vim 还没有为该情况实现补全功能。在那个场合，你的 <code class="special">&lt;Tab&gt;</code> 就会被当作
字符插入文本 (显示为 ^I)。


匹 配 列 表

当匹配有很多时，你可能希望看到一个总览。要看匹配总览，请按 <code class="keystroke">CTRL-D</code>。例如，你键
入了以下命令以后按 <code class="keystroke">CTRL-D</code>: 
<code class="example"></code>
<code class="example">        :set is</code>
<code class="example"></code>
结果是: 
<code class="example"></code>
<code class="example">        :set is</code>
<code class="example">        incsearch  isfname    isident    iskeyword  isprint</code>
<code class="example">        :set is</code>
<code class="example"></code>
Vim 列出了匹配，然后又伴随着你早先键入的命令回到命令行。你现在可以检验匹配列
表，找你想要的选项了。如果它不在列表中，你可以用 <code class="special">&lt;BS&gt;</code> 修正那个词。如果匹配太
多了，就在按 <code class="special">&lt;Tab&gt;</code> 键补全命令之前再多打几个字符。
   如果你仔细观察了，你就会<code class="note">注意</code>到选项 "incsearch" 不是以 "is" 开头。在这个场
合，"is" 指的就是 "incsearch" 的简称。(许多选项都有其简称和全称。) Vim 知道你
可能要把选项的简称扩展成全称，够聪明的吧。


更 多 选 项

命令 <code class="keystroke">CTRL-L</code> 把词补全为最长无歧义字符串。如果你键入 ":edit i" 而目录内存放着文
件 "info.txt" 和 "info_backup.txt"，那么，你将得到 ":edit info"。

选项 <a href="options.html#'wildmode'">'wildmode'</a> 可用来改变补全时采用的方式。
选项 <a href="options.html#'wildmenu'">'wildmenu'</a> 可用来取得菜单式的匹配列表。
利用选项 <a href="options.html#'suffixes'">'suffixes'</a> 来指定一些不太重要的文件，并让它们出现在文件列表末尾。
选项 <a href="options.html#'wildignore'">'wildignore'</a> 指定一些根本用不着表列的文件。

欲知更多此类选项详情，参见:  <a href="cmdline.html#cmdline-completion">cmdline-completion</a> 

</section><hr class="doubleline" /><section class=inner>
<h4><b class="vimtag"> <a name="20.4">20.4</a> </b>  命令行历史</h4>
我们曾经在第三章简单提到过历史记录功能。其基本用法就是你可以用 <code class="special">&lt;Up&gt;</code> 键调用较
早的命令行。而 <code class="special">&lt;Down&gt;</code> 键则让你回到较晚的命令行。

历史记录功能实际上共有五种。我们在这里要提到的是用于 ":" 冒号命令以及用于 "/"
和 "?" 搜索命令的历史记录功能。"/" 和 "?" 命令共享同一历史记录。因为两者同为搜
索命令。另外三种历史记录功能分别用于表达式、调试模式命令和 input() 函数的输入
行。 <a href="cmdline.html#cmdline-history">cmdline-history</a> 

假定你完成了一个 ":set" 命令，又键入了十个冒号命令，然后要再次执行那个 ":set"
命令。你本可以按一个 ":"，然后按十次 <code class="special">&lt;Up&gt;</code>。更快捷的方法是: 
<code class="example"></code>
<code class="example">        :se&lt;Up&gt;</code>
<code class="example"></code>
你现在就回到以前执行过的，以 "se" 开头的命令。没准儿那就是你想找的 ":set" 命
令。至少你不至于按很多 <code class="special">&lt;Up&gt;</code> 键 (除非你执行的都是 ":set" 命令)。

<code class="special">&lt;Up&gt;</code> 键用你在命令行上已经键入的文本去跟历史记录里的命令作比较。只有匹配的命令
才被显示出来。
   如果你没找到你要找的命令，用 <code class="special">&lt;Down&gt;</code> 回到你键入的文本作修改。或者用 <code class="keystroke">CTRL-U</code>
从头来过。

显示历史记录里所有的命令: 
<code class="example"></code>
<code class="example">        :history</code>
<code class="example"></code>
那是 ":" 冒号命令的历史记录。搜索历史记录用这个命令来显示: 
<code class="example"></code>
<code class="example">        :history /</code>
<code class="example"></code>
如果你不愿用光标方向键，<code class="keystroke">CTRL-P</code> 作用就跟 <code class="special">&lt;Up&gt;</code> 一样。而 <code class="keystroke">CTRL-N</code> 跟 <code class="special">&lt;Down&gt;</code> 一样。
<code class="keystroke">CTRL-P</code> 意指前一个 (previous)，<code class="keystroke">CTRL-N</code> 意指下一个 (next)。

</section><hr class="doubleline" /><section class=inner>
<h4><b class="vimtag"> <a name="20.5">20.5</a> </b>  命令行窗口</h4>
在命令行上键入文本跟插入模式下键入文本有所不同。许多修改文本的命令都不能用。对
大多数命令而言，那问题不大，但有时你必须键入一个复杂的命令。那样的场合用命令行
窗口就非常有用了。

用这个命令来打开命令行窗口: 
<code class="example"></code>
<code class="example">        q:</code>
<code class="example"></code>
Vim 现在就在屏幕底部打开了一个 (很小的) 窗口。它存放着命令行历史记录，以及一行
空行在末尾:

        +-------------------------------------+
        |other window                         |
        |~                                    |
         <code class="badlink">file.txt=============================</code> 
        |:e c                                 |
        |:e config.h.in                       |
        |:set path=.,/usr/include,,           |
        |:set iskeyword=@,48-57,_,192-255     |
        |:set is                              |
        |:q                                   |
        |:                                    |
         <code class="badlink">command-line=========================</code> 
        |                                     |
        +-------------------------------------+

现在你处于普通模式下。你可以用 "hjkl" 键来移动光标。例如，用 "5k" 上移至
":e config.h.in" 那一行。键入 "$h" 移到 "in" 的 "i" 字符上，并键入 "cwout"。
现在你把这一行改成了这样:

<code class="section">        :e config.h.out </code>

现在按 <code class="special">&lt;Enter&gt;</code> 执行这个命令。命令行窗口就关上了。
按 <code class="special">&lt;Enter&gt;</code> 键执行光标下的那个命令。这跟 Vim 处于插入模式抑或普通模式无关。
   在命令行窗口内所作的修改不会被保存。它们不会导致历史记录被修改。唯一例外就
是你执行的命令将被加到历史记录的末尾，跟所有执行过的命令一样。

在你要总览历史记录时，命令行窗口十分有用，查找类似命令，修改一点点，然后执行
它。一个搜索命令可用来寻找某些东西。
   在前面那个例子中，搜索命令 "?config" 是可以用来寻找先前那个含有 "config" 的
命令的。这有点儿特别，因为你是在命令行窗口内用命令行作搜索。在键入搜索命令时，
你打不开另一个命令行窗口，命令行窗口是唯一的。

</section><hr class="doubleline" /><section class=inner>
<h4></h4>下一章:  <a href="usr_21.html#usr_21.txt">usr_21.txt</a>   离开和回来

版权: 参见  <a href="usr_01.html#manual-copyright">manual-copyright</a>   vim:tw=78:ts=8:noet:ft=help:norl:
</section>
</article>
<footer>
Generated by vim2html
</footer>
</body>
</html>
